package com.btpj.blog_server.service;

import com.btpj.blog_server.entity.Role;
import com.btpj.blog_server.entity.User;
import com.btpj.blog_server.mapper.RoleMapper;
import com.btpj.blog_server.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class UserService implements UserDetailsService {

    @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
    @Autowired
    UserMapper userMapper;

    @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
    @Autowired
    RoleMapper roleMapper;

    @Override
    public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
        User user = userMapper.getUserByName(name);
        if (user == null) {
            //避免返回null，这里返回一个不含有任何值的User对象，在后期的密码比对过程中一样会验证失败
            return new User();
        }
        // 查询用户的角色信息，并返回存入user中
        List<Role> roles = roleMapper.getRolesByUserId(user.getId());
        user.setRoles(roles);
        return user;
    }

    /**
     * 根据用户ID获取指定的用户
     *
     * @param id 用户ID
     * @return 用户ID相对应的用户
     */
    public User getUserById(Long id) {
        return userMapper.getUserById(id);
    }

    /**
     * 获取昵称中包含词的用户
     *
     * @param nickName 要匹配的昵称(检索)
     * @return 昵称检索出来的用户集
     */
    public List<User> getUsersByNickName(String nickName) {
        return userMapper.getUsersByNickName(nickName);
    }


    /**
     * 获取所有的角色集
     *
     * @return 所有的角色集
     */
    public List<Role> getAllRoles() {
        return roleMapper.getAllRoles();
    }

    /**
     * 更新用户的角色
     *
     * @param roleIds 角色的ID数组
     * @param userId  要更新的用户的ID
     * @return 更新影响的行数
     */
    public int updateUserRoles(Long[] roleIds, Long userId) {
        userMapper.deleteUserRolesByUserId(userId);
        return userMapper.setUserRoles(roleIds, userId);
    }

    /**
     * 设置用户是否启用
     *
     * @param enable 用户是否启用
     * @param userId 要更新的用户的ID
     * @return 更新影响的行数
     */
    public int setUserEnable(Boolean enable, Long userId) {
        return userMapper.setUserEnable(enable, userId);
    }

    /**
     * 删除用户(这里做的假删除，外键限制)
     *
     * @param userId 要删除的用户的ID
     * @return 删除影响的行数
     */
    public int deleteUserById(Long userId) {
        return userMapper.deleteUserById(userId);
    }

    /**
     * 更新用户的邮箱
     *
     * @param userId 要更新的用户的ID
     * @param email  更新后用户的邮箱
     * @return 更新影响的行数
     */
    public int updateUserEmail(Long userId, String email) {
        return userMapper.updateUserEmail(userId, email);
    }
}
